import { Jari } from '@jari-ace/app-bolts';
import { useBridge } from '@jari-ace/element-plus-component';
import { acceptHMRUpdate, defineStore } from 'pinia';

let timeoutId: number;

interface AccessState {
  /**
   * 用户信息
   */
  userInfo: Jari.Ace.User | null;
  /**
   * 用户角色
   */
  userRoles: string[];
}

const { getBaseAppData } = useBridge(import.meta.env.VITE_APP_NAME);

/**
 * @zh_CN 用户信息相关
 */
export const useUserStore = defineStore('core-user', {
  actions: {
    setUserInfo(userInfo: Jari.Ace.User) {
      // 设置用户信息
      this.userInfo = userInfo;
      // 设置角色信息
      const roles = userInfo?.roles ?? [];
      this.setUserRoles(roles);
    },
    setUserRoles(roles: string[]) {
      this.userRoles = roles;
    },
    /**
     * 获取用户数据
     * @param retryCount 重试次数
     * @param maxRetries 最大重试次数
     * @param timeout 重试时间
     * @returns
     */
    async getUserWithRetry(
      retryCount: number = 0,
      maxRetries: number = 10,
      delay: number = 1000,
    ): Promise<Jari.Ace.User> {
      return new Promise((resolve, reject) => {
        try {
          // 从基座应用获取分发的数据  基座应用
          const data = getBaseAppData().loginUser;
          // 如果为null 说明获取数据失败
          if (data === null) {
            // 抛错 进入catch
            throw new Error('Data is null');
          }
          console.log('获取到用户信息', data);
          // 设置用户信息
          this.setUserInfo(data);
          // 返回数据
          resolve(data);
        } catch {
          // 判断重试次数是否超过最大次数
          if (retryCount < maxRetries) {
            retryCount++;
            // 延迟重试
            setTimeout(async () => {
              try {
                // 重新获取用户信息
                const result = await this.getUserWithRetry(
                  retryCount,
                  maxRetries,
                  delay,
                );
                resolve(result); // 内层成功 → 外层解析
              } catch (innerError) {
                // 内层失败 递归执行
                reject(innerError);
              }
            }, delay);
          } else {
            console.error('Max retries reached, data still null');
            reject(new Error('Max retries reached, data still null'));
          }
        }
      });
    },
  },
  state: (): AccessState => ({
    userInfo: null,
    userRoles: [],
  }),
});

// 解决热更新问题
const hot = import.meta.hot;
if (hot) {
  hot.accept(acceptHMRUpdate(useUserStore, hot));
}
